package com.jprocms.module.cms.dal.dataobject.model;

import com.jpro.framework.common.util.json.JsonUtils;
import com.jpro.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.jprocms.module.cms.enums.EnumModelGlobal;
import com.jprocms.module.cms.util.ModelWrapper;
import lombok.*;
import org.apache.commons.lang3.StringUtils;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 模型 DO
 *
 * @author jprocms
 */
@TableName("cms_model")
@KeySequence("cms_model_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ModelDO extends BaseDO {

    private static final long serialVersionUID = 1L;

    /**
     * 全局唯一标识符
     */
    @TableId
    private Long id;
    /**
     * 名称
     */
    private String name;
    /**
     * 是否全局(1全局  0站点模型)
     */
    private Integer isGlobal;
    /**
     * 站点ID
     */
    private Long siteId;
    /**
     * 开启状态
     */
    private Integer status;
    /**
     * 模型类型（1-栏目模型  2-内容模型）
     */
    private Integer modelType;
    /**
     * 排序值
     */
    private Integer sort;
    /**
     * 主面板区域字段json
     */
    private String mainFields;
    /**
     * 自定义字段json
     */
    private String customs;

    /**
     * 面板右侧自定义字段json
     */
    private String rightFields;
    /**
     * 模板前缀
     */
    private String tplPrefix;

    /**
     * 是否全局模型
     *
     * @return
     */
    @JsonIgnore
    public boolean getGlobal() {
        return EnumModelGlobal.GLOBAL.getGlobal().equals(getIsGlobal());
    }

    @JsonIgnore
    public List<ModelWrapper.Field> getFieldList() {
        String customs = getCustoms();
        if (StringUtils.isBlank(customs)) {
            return Collections.emptyList();
        }
        return JsonUtils.parseArray(customs, ModelWrapper.Field.class);
    }

    @JsonIgnore
    public Map<String, ModelWrapper.Field> getFieldMap() {
        return getFieldList().stream().collect(Collectors.toMap(ModelWrapper.Field::getCode, field -> field));
    }


}
